package com.gitee.deament.server.core.cli.db.set;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.DBData;
import com.gitee.deament.server.core.data.datatype.Value;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.List;
import java.util.Set;

/**
 * SMOVE source destination member
 * 可用版本： >= 1.0.0
 * 时间复杂度: O(1)
 * 将 member 元素从 source 集合移动到 destination 集合。
 *
 * SMOVE 是原子性操作。
 *
 * 如果 source 集合不存在或不包含指定的 member 元素，则 SMOVE 命令不执行任何操作，仅返回 0 。否则， member 元素从 source 集合中被移除，并添加到 destination 集合中去。
 *
 * 当 destination 集合已经包含 member 元素时， SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
 *
 * 当 source 或 destination 不是集合类型时，返回一个错误。
 *
 * 返回值
 * 如果 member 元素被成功移除，返回 1 。 如果 member 元素不是 source 集合的成员，并且没有任何操作对 destination 集合执行，那么返回 0 。
 * @author deament
 */
@CliHander(command = "SMOVE")
public class SMOVEcli extends AbstractCli {
    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {
        List<String> cliValues = getValues(command);
        if (cliValues.size() !=4) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'SMOVE' command"));
            return;
        }
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        DBData dbData = SystemConfig.dbData;
        String source = cliValues.get(1);
        String destination = cliValues.get(2);
        String member = cliValues.get(3);
        try {
            Value<Set<String>> sourceSet = dbData.getSet(db, source);
            Value<Set<String>> destinationSet = dbData.getSet(db, destination);
            sourceSet.getValue().remove(member);
            dbData.setSetData(db, destination, member);
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("1"));
        }catch (Exception e) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(e.getMessage()));
        }

    }
}
